package Tests;

import java.io.*;
import java.net.*;

/**
 * Klasa bedeca watkiem sluzaca do obslugiwania klinetow serwera
 * @author Artur Smolibowski
 */
public class Watek extends Thread {
  
  /** Gniazdo klienta */
  private Socket client = null;
  /** Strumien wejscia */
  private BufferedReader in = null;
  /** Strumien wyjscia */
  private PrintWriter out = null;
  /** Zmienna przechowujac dane przeslane przez klienta  */
  private String line = "";
  /** referencja do serwera ktory obsluguje ten watek */
  private Server wsk;
  /** Zmienna boolowska okreslajaca czy nawiazano polaczenie */
  boolean czNawiazanoPolaczenie;
  
  /**
   * Konstruktor domyslny klasy
   * @param wsk referencja do serwera ktory obsluguje ten watek
   */
  Watek(Server wsk) {
    this.wsk=wsk;
  }

  		
  /**
   * Funckja sluzaca do nawiazywania polaczenia z klientem oraz pobieraniem oraz na wyslaniu danych od niego 
   */
  private void listenSocket() {
    czNawiazanoPolaczenie=true;
    line="";
    try {
      synchronized(wsk) {
        client = wsk.server.accept();
      }
      //System.out.println("Nawiazanie polaczenia, watek: "+this.getName());
    } 
    catch (IOException e) {
      //System.out.println("Nie nawiazano polaczenia: 4444, watek: "+this.getName()); System.exit(-1);
    }
    
    try {
      in = new BufferedReader(new InputStreamReader(client.getInputStream()));
      out = new PrintWriter(client.getOutputStream(), true);
    } 
    catch (IOException e) {
      //System.out.println("Nie nawiazano polaczenia na porcie: 4444, watek: "+this.getName());
      czNawiazanoPolaczenie=false;
    }
    
    if(czNawiazanoPolaczenie) {
    	
      int bladOdczytu=0;
      while(line != null) {
        String tmp="";
        
        try {
          line = in.readLine();
          //System.out.println(line);
          
          if(line!=null && line.equals("S_REFRESH")) {
            out.println("S_REFRESH_5_[111_4/4_2]_[112_4/4_0]_[113_3/4_1]_[1_1/2_2]_[12_2/4_2]");
          }
          if(line!=null && line.equals("S_NEWGAME_4_2_1")) {
            out.println("S_CREATE");
          }
          if(line!=null && line.equals("S_NEWGAME_2_1_1")) {
            out.println("S_CREATE");
          }
          if(line!=null && line.equals("S_JOIN_112")) {
            out.println("S_ID_3");
          }
          if(line!=null && line.equals("S_JOIN_1")) {
            out.println("S_ID_3");
          }
          if(line!=null && line.equals("G_START")) {
            out.println("G_CARDS[0,12;0,11;0,10;0,9;0,0;]");
          }
          if(line!=null && line.equals("G_WYMIANA_2_[1;3;]")) {
            out.println("G_ALL[0,0,12;0,0;0,10;0,1;0,8;][1,1,12;1,11;1,10;1,9;1,8;]_1");
          }
          if(line!=null && line.equals("G_WYMIANA_2_[0;1;]")) {
            out.println("G_ALL[0,0,12;0,0;0,10;0,1;0,8;][1,1,12;1,11;1,10;1,9;1,8;][2,2,12;2,11;2,10;2,9;2,8;][3,3,12;3,11;3,10;3,9;3,8;]_3");
          }
          if(line!=null && line.equals("G_NEW")) {
        	out.println("G_CARDS[2,12;2,11;2,10;2,9;2,0;]");
          }
        } 
        catch (IOException e) {
          bladOdczytu++;
          //System.out.println("Blad odczytu, watek: "+this.getName());
          if(bladOdczytu>10) {
            finalize();
            //System.out.println("Zerwano polaczenie, watek: "+this.getName());
          }
        } 
      }
    }
  }
  
  public PrintWriter getOut() {
    return out;
  }
	  
  /**
   * Funkcja sluzaca do zakonczenia polaczenia miedzy kilientem a serwerem
   */
  public void finalize() {
    try {
      client.close();
      in.close();
      out.close();
      line=null;
      czNawiazanoPolaczenie=false;
    } 
    catch (IOException e) {
      System.out.println("Mozliwe ze nie zostaly zamkniete wszystkie strumienie, watek: "+this.getName()); System.exit(-1);
    }
  }
  
  /**
   * Funkcja wykonywany po wystartowaniu watku
   */
  public void run() {
    while(true) {
      listenSocket();
    }
  }
}